package com.zyl.blog.common.utils;



import com.zyl.blog.common.domain.data.bean.UserContext;

import java.util.List;

/**
 * 线程安全的用户上下文工具类（基于ThreadLocal）
 *
 * <p>使用说明：
 * 1. 在用户登录成功后，调用 setUserContext() 存储用户信息
 * 2. 在业务逻辑中通过 getUserXxx() 获取用户信息
 * 3. 在请求结束时（过滤器/拦截器中），调用 clear() 清理上下文
 * @version v1.0
 * @ProjectName: Personal_Blog
 * @Package: com.zyl.common.utils
 * @ClassName: ThreadLocalUtil
 * @Description:
 * @Author FinalFantasy
 * @Date 2025/2/14-14:37
 */
public class ThreadLocalUtil {

    // 使用静态 final 修饰，确保全局唯一且线程安全
    private static final ThreadLocal<UserContext> USER_CONTEXT = new ThreadLocal<>();

    /**
     * 存储用户上下文（登录成功后调用）
     * @param userContext 用户信息对象
     */
    public static void setUserContext(UserContext userContext) {
        USER_CONTEXT.set(userContext);
    }

    /**
     * 获取当前用户上下文（不存在时抛出异常）
     *
     * @return {@link UserContext }
     */
    public static UserContext getUserContext() {
        UserContext context = USER_CONTEXT.get();
        if (context == null) {
            throw new IllegalStateException("用户未登录或上下文未初始化");
        }
        return context;
    }

    /**
     * 获取用户ID（常用）
     *
     * @return {@link Long }
     */
    public static Long getUserId() {
        return getUserContext().getUserId();
    }

    /**
     * 获取用户名（常用）
     *
     * @return {@link String }
     */
    public static String getUserName() {
        return getUserContext().getUserName();
    }

    /**
     * 获取用户角色列表（权限校验用）
     *
     * @return {@link List }<{@link String }>
     */
    public static List<String> getRoles() {
        return getUserContext().getRoles();
    }

    /**
     * 清理用户上下文（请求结束时调用，防止内存泄漏）
     */
    public static void clear() {
        USER_CONTEXT.remove();
    }
}